

tishi = '''----------------------------------欢迎------------------------------------
_________________________冷链验证数据汇总V2.1___________________________
请您在使用前仔细阅读......

【产品介绍】：此脚本用于公司冷链验证采集设备的数据汇总简单省事。
【注意事项】：您将会依次输入需要汇总数据的总文件夹路径和数据汇总.xls的路径，请确保路径存在准确.
【路径格式介绍及解析】：F:/Data summary_test/test_big 注意是'/'，不是‘\’，直接从电脑上复制的路径需要修改一下。
F:/Data summary/数据汇总.xls  确保在'Data summary'文件夹下的‘数据汇总.xls’(手动输入文件名，自动生成文件)
文件没有与之重复的文件名!!!  ’数据汇总.xls‘为将要自动生成的文件，请您自行命名，一定要带‘.xls’的后缀名。
【注意】： 1，由于文件为.xls格式，是早期的二进制文件格式，导致精创设备导出的文件中第2至26行内容无法自动删除，会生成一个
临时文件，这个文件会自动删除(不用管)。
                   2，T301和精创的集成版本，输入路径会自动识别文件类型进行汇总，但文件类型只能是纯T301的或纯精创的。
【版本号：V2.1  win7及以上系统版本都可用！】
!!!!!!有问题或有好的建议请联系：王硕15939094663(微信同号) QQ2941441869 !!!!!!'''
import tkinter as tk
from tkinter import messagebox      # 需要引用messagebox
import re, os, random, xlrd, xlwt
import openpyxl
from xlutils.copy import copy
# from ttkbootstrap import Style
# from tkinter import Tk, Canvas, PhotoImage

def show_message():
    folder_path = entry1.get()  # 获取输入框中的内容
    output_file = entry2.get()  # 获取输入框中的内容
    try:
        if not os.path.exists(folder_path):
            raise Exception('文件夹不存在')
        directory = folder_path
        files = os.listdir(directory)
        selected_file = random.choice(files)
        selected_file_path = os.path.join(directory, selected_file)
        if os.path.isdir(selected_file_path):  # 判断是否为目录
            if folder_path and output_file:
                    # 创建一个新的xls文件
                    output_workbook = openpyxl.Workbook()
                    output_sheet = output_workbook.active
                    output_sheet.title = '汇总数据'

                    # 初始化列数
                    col = 1

                    # 遍历总文件夹中的子文件夹
                    for root, dirs, files in os.walk(folder_path):
                        # 对子文件夹按照名称的数字和中文进行排序
                        dirs.sort(key=lambda x: (
                            int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else float('inf'), x) if not re.search(
                            r'[\u4e00-\u9fa5]+', x) else (float('inf'), x))

                        for i, dir in enumerate(dirs):
                            # 获取子文件夹路径
                            subfolder_path = os.path.join(root, dir)

                            # 判断子文件夹中是否存在xls文件
                            xls_files = [file for file in os.listdir(subfolder_path) if file.endswith('.xls')]

                            # 如果子文件夹中存在xls文件
                            if xls_files:
                                # 遍历子文件夹中的xls文件
                                for file in xls_files:
                                    # 获取xls文件路径
                                    xls_file_path = os.path.join(subfolder_path, file)

                                    # 打开xls文件
                                    xls_workbook = xlrd.open_workbook(xls_file_path)
                                    xls_sheet = xls_workbook.sheet_by_index(0)

                                    # 读取第二列和第三列数据
                                    data = ['时间'] + [xls_sheet.cell_value(row, 1) for row in range(1, xls_sheet.nrows)]

                                    # 创建新的xls文件
                                    new_workbook = xlwt.Workbook(encoding='utf-8')

                                    # 创建新的工作表
                                    new_worksheet = new_workbook.add_sheet('Sheet1')

                                    # 提取子文件夹仪器编号部分（去除前面的序号）
                                    new_name = re.sub(r'^\d+', '', dir.split(".")[0])
                                    file_name_without_prefix_digits_and_suffix_letters = re.sub(r'\D*$', '', new_name)
                                    new_worksheet.write(1, 1,
                                                        "{}温度℃".format(file_name_without_prefix_digits_and_suffix_letters))
                                    temp_data = [f'{new_name} 温度℃'] + [xls_sheet.cell_value(row, 2) for row in
                                                                       range(1, xls_sheet.nrows)]

                                    # 如果是第一个子文件夹
                                    if i == 0:
                                        # 写入第一列和第二列
                                        for j, value in enumerate(data):
                                            output_sheet.cell(row=j + 2, column=1, value=value)
                                        for j, value in enumerate(temp_data):
                                            output_sheet.cell(row=j + 2, column=2, value=value)
                                        col += 1
                                    else:
                                        # 写入新xlsx文件中
                                        for j, value in enumerate(temp_data):
                                            output_sheet.cell(row=j + 2, column=col, value=value)

                                    # 更新列数
                                    col += 1
                            else:
                                # 如果子文件夹中不存在xls文件，则空出一列，并将空列的第一格修改为子文件夹的名字 + '温度℃'
                                output_sheet.cell(row=2, column=col, value=f'{dir} 温度℃')

                                # 更新列数
                                col += 1

                    # 保存新xls文件
                    output_workbook.save(output_file)

                    # 列出总文件夹中的所有文件和文件夹
                    items = os.listdir(folder_path)

                    # 统计子文件夹数量
                    subfolder_count = 0
                    for item in items:
                        item_path = os.path.join(folder_path, item)
                        if os.path.isdir(item_path):
                            subfolder_count += 1



                    # 打开已存在的Excel文件，创建副本以便修改
                    workbook = xlrd.open_workbook(output_file)
                    new_workbook = copy(workbook)

                    # 获取第一个sheet
                    sheet = new_workbook.get_sheet(0)

                    # 在第一行的第二格开始添加数字
                    for j in range(1, subfolder_count + 1):
                        sheet.write(0, j, j)

                    # 保存修改后的副本
                    new_workbook.save(output_file)

                    baocun1 = '感谢您的使用，祝您生活愉快！\n汇总成功，文件保存在：' + output_file + "\n此次汇总的的文件数量：", subfolder_count
                    messagebox.showinfo("温馨提示", baocun1)


            # 判断文件扩展名是否为表格文件类型，xls
        elif selected_file_path.endswith(".xls"):
                # 临时文件路径
                Tem_file_path = folder_path + '临时文件77777777.xls'
                if folder_path and Tem_file_path:
                    # 获取所有xls文件列表
                    file_list = [file for file in os.listdir(folder_path) if file.endswith(".xls")]

                    # 自定义排序函数，按照数字进行排序
                    def sort_by_number(file_name):
                        digits = re.findall(r'^(\d+)', file_name)  # 提取文件名中的数字部分
                        return int(digits[0]) if digits else 0

                    # 按照数字进行排序
                    sorted_files = sorted(file_list, key=sort_by_number)

                    # 打印排序结果
                    for file_name in sorted_files:
                        print(file_name + '已汇总完成...')

                    # 创建新的xls文件
                    new_workbook = xlwt.Workbook(encoding='utf-8')

                    # 创建新的工作表
                    new_worksheet = new_workbook.add_sheet('Sheet1')

                    # 遍历每个xls文件
                    for index, file_name in enumerate(sorted_files):
                        file_path = os.path.join(folder_path, file_name)

                        # 打开当前xls文件
                        workbook = xlrd.open_workbook(file_path)
                        worksheet = workbook.sheet_by_index(0)

                        # 读取数据并追加到新的xls文件
                        if index == 0:
                            # 第一个xls文件读取第二列和第三列的数据
                            for row in range(worksheet.nrows):
                                col_data = worksheet.cell(row, 1).value
                                new_worksheet.write(row, 0, col_data)
                            for row in range(worksheet.nrows):
                                col_data = worksheet.cell(row, 2).value
                                # 设置第27格的数据
                                if row == 26:
                                    file_name_without_prefix_digits = re.sub(r'^\d+', '', file_name.split(".")[0])
                                    file_name_without_prefix_digits_and_suffix_letters = re.sub(r'\D*$', '',
                                                                                                file_name_without_prefix_digits)
                                    new_worksheet.write(row, 1,
                                                        "{}温度℃".format(file_name_without_prefix_digits_and_suffix_letters))
                                else:
                                    new_worksheet.write(row, 1, col_data)
                        else:
                            # 其他xls文件只读取第三列的数据
                            for row in range(worksheet.nrows):
                                col_data = worksheet.cell(row, 2).value
                                # 设置第27格的数据
                                if row == 26:
                                    file_name_without_prefix_digits = re.sub(r'^\d+', '', file_name.split(".")[0])
                                    file_name_without_prefix_digits_and_suffix_letters = re.sub(r'\D*$', '',
                                                                                                file_name_without_prefix_digits)
                                    new_worksheet.write(row, index + 1,
                                                        "{}温度℃".format(file_name_without_prefix_digits_and_suffix_letters))
                                else:
                                    new_worksheet.write(row, index + 1, col_data)

                    # 保存新的xls文件
                    new_workbook.save(Tem_file_path)

                    # 打开已存在的Excel文件
                    workbook = xlrd.open_workbook(Tem_file_path)

                    # 获取第一个sheet
                    sheet = workbook.sheet_by_index(0)

                    # 创建一个新的Excel文件
                    new_workbook = xlwt.Workbook()
                    new_sheet = new_workbook.add_sheet('Sheet1')

                    # 指定要删除的行索引列表
                    rows_to_delete = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
                                      25]

                    # 复制除指定行以外的数据到新的Excel文件
                    new_row = 0
                    for row in range(sheet.nrows):
                        if row not in rows_to_delete:
                            for col in range(sheet.ncols):
                                new_sheet.write(new_row, col, sheet.cell_value(row, col))
                            new_row += 1

                    # 保存新的Excel文件
                    new_workbook.save(output_file)

                    # 统计文件数量
                    file_count = len(
                        [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]) - 1

                    # 打印文件数量
                    print("此次汇总的的文件数量：", file_count)

                    # 打开已存在的Excel文件，创建副本以便修改
                    workbook = xlrd.open_workbook(output_file)
                    new_workbook = copy(workbook)

                    # 获取第一个sheet
                    sheet = new_workbook.get_sheet(0)

                    # 在第一行的第二格开始添加数字
                    for j in range(1, file_count + 1):
                        sheet.write(0, j, j)

                    # 保存新的Excel文件
                    new_workbook.save(output_file)

                    # 要删除的临时文件
                    del_path = Tem_file_path

                    # 删除文件
                    os.remove(del_path)

                    baocun2 = '感谢您的使用，祝您生活愉快！\n汇总成功，文件保存在：' + output_file + "\n此次汇总的的文件数量：", file_count
                    messagebox.showinfo("温馨提示", baocun2)
        else:
            print('发生错误！！！')
    except Exception as error:
        cuo1 = '对不起，您输入的路径有误，请关闭重试。。。。。。'
        messagebox.showinfo("温馨提示", cuo1)


# 窗口界面
win1 = tk.Tk()        # 常见窗口对象
win1.title('冷链验证数据汇总V2.1')       # 添加窗体名称
# win1.iconbitmap('D:/PycharmProject/Data_summary_win7/Data_summaryB/app_test/win_logo.ico')


# D:/PycharmProject/Data_summary_win7/Data_summaryB/app_test/logo.ico
win1.geometry('470x270')        # 设置窗体大小

# style = Style(theme='litera')    # 设置主题

# 想要切换主题，修改theme值即可，有以下这么多的主题，自己尝试吧：['vista', 'classic', 'cyborg',
# 'journal', 'darkly', 'flatly', 'clam', 'alt', 'solar', 'minty', 'litera', 'united',
# 'xpnative', 'pulse', 'cosmo', 'lumen', 'yeti', 'superhero', 'winnative', 'sandstone', 'default']

win1.withdraw()  # 先隐藏主窗口

messagebox.showinfo("温馨提示", tishi)


# 创建文本提示
label = tk.Label(win1, text="请输入总文件夹路径:")
label.pack()
# 创建输入框
entry1 = tk.Entry(win1, width=50, font=('Arial', 10))
entry1.pack()

# 创建文本提示
label = tk.Label(win1, text="请输入数据汇总文件所在的文件夹路径：")
label.pack()
entry2 = tk.Entry(win1, width=50, font=('Arial', 10))
entry2.pack()

# 创建文本提示
label = tk.Label(win1, text="两个输入框把路径填好，然后点击下面的的按钮。")
label.pack()

button = tk.Button(win1, text="点击开始汇总", command=show_message, fg='blue')
button.pack()

disclaimer = tk.Label(win1, text="免责声明：内部使用，侵权联系删除", fg='red')
disclaimer.place(relx=1, rely=1, anchor=tk.SE)

win1.after(1000, win1.deiconify)  # 延迟一秒后显示主窗口


win1.mainloop()         # 执行窗体

